/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import database_beans.PlanAngazovanja;
import database_beans.Predmet;
import database_beans.Spiskovi;
import database_beans.Zaposleni;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import server.Log;
import server.Util;

/**
 *
 * @author stefan
 */
@ManagedBean(name = "spsCtrl")
@ViewScoped
public class ZaposleniSpiskoviControler implements Serializable {

    @ManagedProperty("#{userBean}")
    private UserBean user;

    private Predmet predmet;

    private ArrayList<Predmet> predmetiList;

    private ArrayList<Spiskovi> spiskoviList;

    private ArrayList<String> spiskoviSelected;

    private String selectedPredmet;

    private Date datum;

    private Spiskovi noviSpisak;
    private boolean imaPredmet;

    /**
     * Creates a new instance of ZaposleniSpiskoviControler
     */
    public ZaposleniSpiskoviControler() {

    }

    @PostConstruct
    public void init() {
        Zaposleni z = user.getZaposleni();
        predmetiList = getPredmeteZaposlenog(z);
        noviSpisak = new Spiskovi();
        spiskoviSelected = new ArrayList<>();

    }
    
    public UserBean getUser() {
        return user;
    }

    public void setUser(UserBean user) {
        this.user = user;
    }

    public Predmet getPredmet() {
        return predmet;
    }

    public void setPredmet(Predmet predmet) {
        this.predmet = predmet;
    }

    public ArrayList<Predmet> getPredmetiList() {
        return predmetiList;
    }

    public void setPredmetiList(ArrayList<Predmet> predmetiList) {
        this.predmetiList = predmetiList;
    }

    public ArrayList<Spiskovi> getSpiskoviList() {
        return spiskoviList;
    }

    public void setSpiskoviList(ArrayList<Spiskovi> spiskoviList) {
        this.spiskoviList = spiskoviList;
    }

    public ArrayList<String> getSpiskoviSelected() {
        return spiskoviSelected;
    }

    public void setSpiskoviSelected(ArrayList<String> spiskoviSelected) {
        this.spiskoviSelected = spiskoviSelected;
    }

    public String getSelectedPredmet() {
        return selectedPredmet;
    }

    public void setSelectedPredmet(String selectedPredmet) {
        this.selectedPredmet = selectedPredmet;
    }

    public Date getDatum() {
        return datum;
    }

    public void setDatum(Date datum) {
        this.datum = datum;
    }

    public Spiskovi getNoviSpisak() {
        return noviSpisak;
    }

    public void setNoviSpisak(Spiskovi noviSpisak) {
        this.noviSpisak = noviSpisak;
    }
    
    

    public ArrayList<Predmet> getPredmeteZaposlenog(Zaposleni z) {
        if (z == null) {
            return null;
        }
        ArrayList<Predmet> list = new ArrayList<Predmet>();
        for (PlanAngazovanja p : new ArrayList<PlanAngazovanja>(z.getPlanAngazovanjas())) {
            list.add(p.getPredmet());
        }
        for (Predmet p : list) {
            Hibernate.initialize(p.getSpiskovis());
        }
        return list;
    }

    public void onChangePredmet() {
        predmet = new Predmet();
        spiskoviList = null;
        if (!"".equals(selectedPredmet)) {
            for (Predmet p : predmetiList) {
                if (selectedPredmet.equals(p.getNaziv())) {
                    predmet = p;
                    Log.i("Detektovana promena predmeta" + selectedPredmet);
                    loadSpiskovi(predmet);
                    imaPredmet = true;
                }
            }
        }
    }

    private void loadSpiskovi(Predmet p) {
        spiskoviList = new ArrayList(p.getSpiskovis());
    }

    public void snimiSpisak() {
        
        if (imaPredmet) {
            Session session = Util.getSesion();
            Transaction t = session.beginTransaction();
            try {
                noviSpisak.setTermin(datum.toString());
                noviSpisak.setPredmet(predmet);
                noviSpisak.setZakljucan(false);
                session.save(noviSpisak);
                t.commit();
                spiskoviList.add(noviSpisak);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Spisak snimljen!"));
                imaPredmet = false;
                noviSpisak = new Spiskovi();
            } catch (Exception e) {
                t.rollback();
                e.printStackTrace();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Greska!! Spisak nije snimljen"));
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Morate odabrati predmet!"));
        }
    }

    public void zakljuciSpisak() {
        if(!spiskoviSelected.isEmpty()){
        Session session = Util.getSesion();
        Transaction t = session.beginTransaction();
        try {
            for (String s : spiskoviSelected) {
                for (Spiskovi sps : spiskoviList) {
                    if (s.equals(sps.getNaziv())) {
                        sps.setZakljucan(true);
                        //String naziv = 
                        session.update(sps);
                    }
                }
            }
            t.commit();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Spiskovi uspesno zakljucani!"));

        } catch (Exception e) {
            t.rollback();
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Greska!! Spisak nije zakljucen"));
        }
        }
    }

}
